/* 
 *
 */
function Person(name,age,sex='女'){
    console.log(arguments,'!!!!!!!!');
    arguments[1]=27;
    this.name=name;
    this.age=age;
    this.sex=sex;
}

Person.prototype.sayhi=function(){
    console.log('holle');
}

// 构造函数中不写函数，实例化时消耗内存空间，消耗时间
// 实例除了属性各有各的（“私有的” constructor）通过prototype对象间共享的方法（prototype）
// 七天里写了js constructor 完成对象构造，再用prototype链接共享方法

const objectFactory=function(){
    console.log(arguments);
    var obj=new Object();
    //构造
    // var varConstructor=arguments[0];
    // console.log(varConstructor,'----');
    // var arrVars=arguments[1,arguments.length-1];
    
    //链表 队列
    // arguments是一个形似数组的对象，伪数组，有length，可以循环，可以下标访问，但是没有更多的方法
    // [].shift []对象 shift 上的方法
    // this -> []  call -> arguments
    var varConstructor=[].shift.call(arguments); //shift 队头操作 call 借用别的对象的方法
    // var varConstructor=Array.from(arguments).shift(); // from ES6新方法 将伪数组转化为真正的数组
    varConstructor.call(obj,...arguments); // ... ES6 展开运算符 call 参数按顺序传
    obj.__proto__=varConstructor.prototype;
    return obj;
}

const obj = objectFactory(Person,'吴亦凡',18,'nan');
console.log(obj,'-!!!--');